package br.ufc.apsoo.models;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

@Entity
@Table(name = "despesa")
@SequenceGenerator(name = "seq_despesa", sequenceName = "seq_despesa")
public class Despesa implements Serializable {

	/**
	 * Generated Serial
	 */
	private static final long serialVersionUID = -5898280749300243313L;

	@Id
	@Column(name = "id_despesa")
	@GeneratedValue(generator = "seq_despesa", strategy = GenerationType.AUTO)
	private Long id;

	@NotNull(message = "O campo quantidade é obrigatório!")
	@Min(value = 1, message = "O menor valor possível é um!")
	@Column(name = "quantidade")
	private Integer quantidade;

	@NotNull(message = "O campo serviço é obrigatório!")
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "id_servico")
	private Servico servico;

	@NotNull
	@ManyToOne
	@JoinColumn(name = "id_reserva")
	private Reserva reserva;

	@NotNull
	private Boolean estornada = new Boolean(false);

	@NotNull
	private Date data;

	@Transient
	private BigDecimal total;

	@Transient
	private String dataFormatada;

	private void atualizaTotal() {
		if (servico != null && servico.getValor() != null) {
			total = servico.getValor().multiply(new BigDecimal(quantidade));
		}
	}

	public boolean foiEstornada() {
		return estornada.booleanValue();
	}

	public Date getData() {
		return data;
	}

	public Boolean getEstornada() {
		return estornada;
	}

	public Long getId() {
		return id;
	}

	public Integer getQuantidade() {
		return quantidade;
	}

	public Reserva getReserva() {
		return reserva;
	}

	public Servico getServico() {
		return servico;
	}

	public BigDecimal getTotal() {
		total = servico.getValor().multiply(new BigDecimal(quantidade));
		return total;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public void setEstornada(Boolean estornada) {
		this.estornada = estornada;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
		atualizaTotal();
	}

	public void setReserva(Reserva reserva) {
		this.reserva = reserva;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
		atualizaTotal();
	}
	
	public String getDataFormatada() {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		dataFormatada = sdf.format(data); 
		return dataFormatada; 
	}

	public void setDataFormatada(String dataFormatada) {
		this.dataFormatada = dataFormatada;
	}

	public void setTotal(BigDecimal total) {
		this.total = total;
	}
}
